/**
 * 
 */

import java.util.Scanner;
import java.util.InputMismatchException;


/**
 * @author SERGIO MOLINA
 * Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * Sergio Molina
 * 10256
 * 23 de agosto de 2011
 * Descripcion: Clase principal CalculadoraPostFix donde se establece una pila
 * y los distintos operandos para usar en la calculadora, este sigue uso de
 * sintaxis postfix
 * 
 */

public class CalculadoraPostFix {

	 /**
     * @param args the command line arguments
     */
    //inicializamos una calculadora postfix como un stack de tipo double para usarla como global en todos los metodos
    static Stackito <Double> calcu = new Stackito <Double> ();
        
    /**
     * clase principal
     * @param args
     */
   public static void main(String[] args) {
	
       double ingreso;
       int opcion1;
       // inicia el menu inicial
       do{
           menu();
           opcion1=(int)verificarNumero("\nIngrese su opcion: ");
           switch(opcion1){
               case 1:
                  //si el esta no se encuentra vacio, lo limpiara
                   do{
                       calcu.pop();
                   }
                   while(!calcu.empty());
                   // pide el ingreso de dos operandos y los ingresa al stack
                   for(int x=0;x<2;x++){ 
                   ingreso = (double)verificarNumero("\nIngrese el operando: ");
                   calcu.push(ingreso);
                   }
                   operar();
                   break;
               case 2:
                   //si no se encuentra vacio pide el ingreso de un numero y lo ingresa al stack
                   if(!calcu.empty()){
                       ingreso = (double)verificarNumero("\nIngrese el operando: ");
                       calcu.push(ingreso);
                       operar();
                   }
                   // si esta vacio despliega que no existe resultado anterior
                   else
                       System.out.println("No hay un resultado guardado!");
                   break;
               case 3:
                   //sale del programa
                   System.out.println("Adios! :D");
                   System.exit(0);
                   break;
               default: 
                   System.out.println("ERROR: No se encuentra entre las opciones!\n");
          }
        
       }
       while(opcion1!=3);
   }
   // 
   /**
    *    Menu de la calculadora
    */
   public static void menu(){
       System.out.println();
       System.out.println("+--       MENU DE CALCULADORA       --+");
       System.out.println("| 1. Nueva operacion                  |");
       System.out.println("| 2. Continuar operacion anterior     |");
       System.out.println("| 3. Salir                            |");        
       System.out.println("+-------------------------------------+");
       
   
   }
   //
   /**METODO PARA OPERAR
    * 
    */
   public static void operar(){
       
       double resultado,operando1,operando2;
       int opcion2;
       //MANDA A LLAMAR EL SEGUNDO MENU
       menu2();
       opcion2=(int)verificarNumero("\nQue operacion desea realizar: ");
       //coloca los ultimos valores guardados en el stack en dos operandos
       operando2=calcu.pop();
       operando1=calcu.pop();
       //inicializa el resultado como 0
       resultado=0;
       //si la opcion se encuentra entre (0,5) realiza las operaciones q se piden
       if(opcion2>0 && opcion2<5){
           switch(opcion2){
               //suma
               case 1:
                   resultado=operando1+operando2;
                   break;
               //resta
               case 2:
                   resultado=operando1-operando2;
                   break;
               //multiplica
               case 3:
                   resultado=operando1*operando2;
                   break;
               //divide
               case 4:
                   //revisa si la division no es en 0
                   if(operando2!=0)
                       resultado=operando1/operando2;
                   else
                       System.out.println("No puede haber division por cero!!!");
                   break;
               default:
            }
           //despliega resultado e ingresa resultado en el stack
           System.out.println("\nEl resultado de la operacion es: "+resultado);
           calcu.push(resultado);        
       }    
       else
           System.out.println("\nNo es una opcion");
   }
   // 
   /**MENU DE LAS OPERACIONES POSIBLES
    * 
    */
   public static void menu2(){
       System.out.println();
       System.out.println("+--MENU DE OPERACIONES--+");
       System.out.println("| 1. Sumar              |");
       System.out.println("| 2. Restar             |");
       System.out.println("| 3. Multiplicar        |");
       System.out.println("| 4. Dividir            |");        
       System.out.println("+-----------------------+");
   }
   //
   /**
    * verifica que lo ingresado sea un numero
    * @param msj
    * @return
    */
   public static double verificarNumero(String msj){
       Scanner teclado = new Scanner(System.in);
       double num=0;
       System.out.print(msj);
       
       try{
           num = teclado.nextDouble();
       }
       catch(InputMismatchException exception){
           System.out.println("\nERROR!\n");
       }
       teclado.nextLine();
       return num;
   }
}
